<?php
namespace Swiftx\Component\Router;
use Swiftx\Interfaces\Router\Request as RequestInterface;

class Request implements RequestInterface{

    /**
     * 请求协议
     * @var string
     */
    protected $protocol = null;

    /**
     * 主机地址
     * @var string
     */
    protected $host = null;

    /**
     * 端口号
     * @var int
     */
    protected $port = null;

    /**
     * 目标文档
     * @var string
     */
    protected $document = null;

    /**
     * 请求状态
     * @var int
     */
    protected $status = self::UnFinished;

    /**
     * 请求方式
     * @var string
     */
    protected $method = null;

    /**
     * 到达时间
     * @var int
     */
    protected $create_time = null;

    /**
     * 请求参数
     * @var array
     */
    protected $params = [];

    /**
     * @var null
     */
    protected $post = null;

    /**
     * 获取协议类型
     * @return string
     */
    public function setProtocol(string $value) {
        $this->protocol = $value;
    }

    /**
     * 获取协议类型
     * @return string
     */
    public function getProtocol():string{
        return $this->protocol;
    }

    /**
     * 设置主机名
     * @param string $value
     */
    public function setHost(string $value){
        $this->host = $value;
    }

    /**
     * 读取主机名
     * @return string
     */
    public function getHost():string{
        return $this->host;
    }

    /**
     * 设置端口号
     * @param int $value
     */
    public function setPort(int $value){
        $this->port = $value;
    }

    /**
     * 读取端口号
     * @return int
     */
    public function getPort():int {
        return $this->port;
    }

    /**
     * 设置请求文档
     * @param string $value
     * @return void
     */
    public function setDocument(string $value){
        $this->document = $value;
    }

    /**
     * 获取请求目标
     * @return string
     */
    public function getDocument(): string{
        return $this->document;
    }

    /**
     * 设置状态码
     * @param int $value
     * @return void
     */
    public function setStatus(int $value){
        $this->status = $value;
    }

    /**
     * 获取状态码
     * @return int
     */
    public function getStatus():int{
        return $this->status;
    }

    /**
     * 设置请求方式
     * @param string $value
     * @return void
     */
    public function setMethod(string $value){
        $this->method = strtoupper($value);
    }

    /**
     * 获取请求方式
     * @return string
     */
    public function getMethod():string{
        return $this->method;
    }

    /**
     * 设置时间戳
     * @param int $timestamp
     */
    public function setCreateTime(int $timestamp){
        $this->create_time = $timestamp;
    }

    /**
     * 获取时间戳
     * @return int
     */
    public function getCreateTime():int{
        return $this->create_time;
    }

    /**
     * 设置请求参数
     * @param string $key
     * @param mixed $value
     */
    public function setParam(string $key, $value){
        $this->params[$key] = $value;
    }

    /**
     * 批量设置参数
     * @param array $data
     */
    public function setParams(array $data){
        $this->params = array_merge($this->params, $data);
    }

    /**
     * 是否有请求参数
     * @param string $key
     * @return bool
     */
    public function hasParam(string $key):bool {
        return isset($this->params[$key]);
    }

    /**
     * 读取请求参数
     * @param string $key
     * @param mixed $default
     * @return mixed
     */
    public function getParam(string $key, $default=null){
        if(isset($this->params[$key]))
            return $this->params[$key];
        return $default;
    }

    /**
     * 批量读取参数
     * @return array
     */
    public function getParams():array {
        return $this->params;
    }

}